2. Каркас виджета

20-09-2026 2 min

Создадим файл MainWindow.vala

using GLib;
using Gtk;

public class HyprCalendar.MainWindow : Gtk.ApplicationWindow {
    public MainWindow(Gtk.Application parent){
        GLib.Object(application:parent);
        set_name("main_window");
        create_ui();
    }

    private void create_ui() {
        var calendar = new Gtk.Calendar();
        set_child(calendar);
    }
}

создадим файл Application.vala

using GLib;
using Gtk;
using GtkLayerShell;


public class HyprCalendar.Application: Gtk.Application {
    public Application() {
        Object(application_id: "com.github.HyprCalendar");
    }

    public override void activate() {
        var window = new MainWindow(this);
        GtkLayerShell.init_for_window(window);
        GtkLayerShell.set_layer(window, GtkLayerShell.Layer.TOP);
        GtkLayerShell.set_namespace(window, "HyprCalendar");
        GtkLayerShell.set_anchor(
            window,
            GtkLayerShell.Edge.TOP,
            true
        );
        window.present();
    }

    public static int main() {
        var application = new HyprCalendar.Application();
        return application.run();
    }
}

инициализируем проект

cd HyprCalendarWidget
meson setup build

в папке проекта появится папка build. Соберём проект

ninja -C build

запустим проект

./build/hypr_calendar_widget

после запуска по верх открытых приложений появится окно

Чтобы закрыть его, нажмите сочетание клавиш Ctrl + C в консоли

Разбор Application.vala

Библиотека Gtk требует чтобы у каждого приложения был application id

public Application() {
	Object(application_id: "com.github.HyprCalendar");
}

activate вызывается при запуске приложения или повторном открытии уже запущенного экземпляра

public override void activate()

В переменной window хранится наше окно описанное в файле MainWindow.vala

var window = new MainWindow(this);

Для того чтобы взаимодействовать с протоколом LayerShell нужно передать библиотеке gtk4-layer-shell созданное окно.

GtkLayerShell.init_for_window(window);

Для того чтобы окно располагалось по верх всех открытых приложений, его нужно открывать на верхнем слое. Подробнее о слоях

GtkLayerShell.set_layer(window, GtkLayerShell.Layer.TOP);

Имя пространства нужно для удобства, используя это имя можно в конфиге Hyprland настроить блюр, анимации и другие украшательства.

GtkLayerShell.set_namespace(window, "HyprCalendar");

Здесь задан верхний якорь для окна. Если включить все 4 якоря, то окно растянется на весь монитор.

GtkLayerShell.set_anchor(
	window,
	GtkLayerShell.Edge.TOP,
	true
);

window.present(); показывает окно

Точка входа программы

public static int main() {
	var application = new HyprCalendar.Application();
	return application.run();
}